#ifndef _NE_MIDI_INSTRUMENT_H_
#define _NE_MIDI_INSTRUMENT_H_

#include <neinit.h>

namespace ne
{
    enum MIDIInstrumentType
    {
        // Piano Family:
        // General MIDI instrument 0 ("Acoustic Grand Piano")
        MIDI_ACOUSTICGRANDPIANO = 0,
        // General MIDI instrument 1 ("Bright Acoustic Piano")
        MIDI_BRIGHTACOUSTICPIANO = 1,
        // General MIDI instrument 2 ("Electric Grand Piano")
        MIDI_ELECTRICGRANDPIANO = 2,
        // General MIDI instrument 3 ("Honky Tonk Piano")
        MIDI_HONKYTONKPIANO = 3,
        // General MIDI instrument 4 ("Electric Piano 1")
        MIDI_ELECTRICPIANO1 = 4,
        // General MIDI instrument 5 ("Electric Piano 2")
        MIDI_ELECTRICPIANO2 = 5,
        // General MIDI instrument 6 ("Harpsichord")
        MIDI_HARPSICHORD = 6,
        // General MIDI instrument 7 ("Clavinet")
        MIDI_CLAVINET = 7,

        // Chromatic Percussion Family:
        // General MIDI instrument 8 ("Celesta")
        MIDI_CELESTA = 8,
        // General MIDI instrument 9 ("Glockenspiel")
        MIDI_GLOCKENSPIEL = 9,
        // General MIDI instrument 10 ("Music Box")
        MIDI_MUSICBOX = 10,
        // General MIDI instrument 11 ("Vibraphone")
        MIDI_VIBRAPHONE = 11,
        // General MIDI instrument 12 ("Marimba")
        MIDI_MARIMBA = 12,
        // General MIDI instrument 13 ("Xylophone")
        MIDI_XYLOPHONE = 13,
        // General MIDI instrument 14 ("Tubular Bells")
        MIDI_TUBULARBELLS = 14,
        // General MIDI instrument 15 ("Dulcimer")
        MIDI_DULCIMER = 15,

        // Organ Family:
        // General MIDI instrument 16 ("Drawbar Organ")
        MIDI_DRAWBARORGAN = 16,
        // General MIDI instrument 17 ("Percussive Organ")
        MIDI_PERCUSSIVEORGAN = 17,
        // General MIDI instrument 18 ("Rock Organ")
        MIDI_ROCKORGAN = 18,
        // General MIDI instrument 19 ("Church Organ")
        MIDI_CHURCHORGAN = 19,
        // General MIDI instrument 20 ("Reed Organ")
        MIDI_REEDORGAN = 20,
        // General MIDI instrument 21 ("Accordion")
        MIDI_ACCORDION = 21,
        // General MIDI instrument 22 ("Harmonica")
        MIDI_HARMONICA = 22,
        // General MIDI instrument 23 ("Tango Accordion")
        MIDI_TANGOACCORDION = 23,

        // Guitar Family:
        // General MIDI instrument 24 ("Acoustic Guitar (nylon)")
        MIDI_ACOUSTICGUITARNYLON = 24,
        // General MIDI instrument 25 ("Acoustic Guitar (steel)")
        MIDI_ACOUSTICGUITARSTEEL = 25,
        // General MIDI instrument 26 ("Electric Guitar (jazz)")
        MIDI_ELECTRICGUITARJAZZ = 26,
        // General MIDI instrument 27 ("Electric Guitar (clean)")
        MIDI_ELECTRICGUITARCLEAN = 27,
        // General MIDI instrument 28 ("Electric Guitar (muted)")
        MIDI_ELECTRICGUITARMUTED = 28,
        // General MIDI instrument 29 ("Overdriven Guitar")
        MIDI_OVERDRIVENGUITAR = 29,
        // General MIDI instrument 30 ("Distortion Guitar")
        MIDI_DISTORTIONGUITAR = 30,
        // General MIDI instrument 31 ("Guitar Harmonics")
        MIDI_GUITARHARMONICS = 31,

        // Bass Family:
        // General MIDI instrument 32 ("Acoustic Bass")
        MIDI_ACOUSTICBASS = 32,
        // General MIDI instrument 33 ("Electric Bass (finger)")
        MIDI_ELECTRICBASSFINGER = 33,
        // General MIDI instrument 34 ("Electric Bass (pick)")
        MIDI_ELECTRICBASSPICK = 34,
        // General MIDI instrument 35 ("Fretless Bass")
        MIDI_FRETLESSBASS = 35,
        // General MIDI instrument 36 ("Slap Bass 1")
        MIDI_SLAPBASS1 = 36,
        // General MIDI instrument 37 ("Slap Bass 2")
        MIDI_SLAPBASS2 = 37,
        // General MIDI instrument 38 ("Synth Bass 1")
        MIDI_SYNTHBASS1 = 38,
        // General MIDI instrument 39("Synth Bass 2")
        MIDI_SYNTHBASS2 = 39,

        // Strings Family:
        // General MIDI instrument 40 ("Violin")
        MIDI_VIOLIN = 40,
        // General MIDI instrument 41 ("Viola")
        MIDI_VIOLA = 41,
        // General MIDI instrument 42 ("Cello")
        MIDI_CELLO = 42,
        // General MIDI instrument 43 ("Contrabass")
        MIDI_CONTRABASS = 43,
        // General MIDI instrument 44 ("Tremolo Strings")
        MIDI_TREMOLOSTRINGS = 44,
        // General MIDI instrument 45 ("Pizzicato Strings")
        MIDI_PIZZICATOSTRINGS = 45,
        // General MIDI instrument 46 ("Orchestral Harp")
        MIDI_ORCHESTRALHARP = 46,
        // General MIDI instrument 47 ("Timpani")
        MIDI_TIMPANI = 47,

        // Ensemble Family:
        // General MIDI instrument 48 ("String Ensemble 1")
        MIDI_STRINGENSEMBLE1 = 48,
        // General MIDI instrument 49 ("String Ensemble 2")
        MIDI_STRINGENSEMBLE2 = 49,
        // General MIDI instrument 50 ("Synth Strings 1")
        MIDI_SYNTHSTRINGS1 = 50,
        // General MIDI instrument 51 ("Synth Strings 2")
        MIDI_SYNTHSTRINGS2 = 51,
        // General MIDI instrument 52 ("Choir Aahs")
        MIDI_CHOIRAAHS = 52,
        // General MIDI instrument 53 ("Voice oohs")
        MIDI_VOICEOOHS = 53,
        // General MIDI instrument 54 ("Synth Voice")
        MIDI_SYNTHVOICE = 54,
        // General MIDI instrument 55 ("Orchestra Hit")
        MIDI_ORCHESTRAHIT = 55,

        // Brass Family:
        // General MIDI instrument 56 ("Trumpet")
        MIDI_TRUMPET = 56,
        // General MIDI instrument 57 ("Trombone")
        MIDI_TROMBONE = 57,
        // General MIDI instrument 58 ("Tuba")
        MIDI_TUBA = 58,
        // General MIDI instrument 59 ("Muted Trumpet")
        MIDI_MUTEDTRUMPET = 59,
        // General MIDI instrument 60 ("French Horn")
        MIDI_FRENCHHORN = 60,
        // General MIDI instrument 61 ("Brass Section")
        MIDI_BRASSSECTION = 61,
        // General MIDI instrument 62 ("Synth Brass 1")
        MIDI_SYNTHBRASS1 = 62,
        // General MIDI instrument 63 ("Synth Brass 2")
        MIDI_SYNTHBRASS2 = 63,

        // Reed Family:
        // General MIDI instrument 64 ("Soprano Sax")
        MIDI_SOPRANOSAX = 64,
        // General MIDI instrument 65 ("Alto Sax")
        MIDI_ALTOSAX = 65,
        // General MIDI instrument 66 ("Tenor Sax")
        MIDI_TENORSAX = 66,
        // General MIDI instrument 67 ("Baritone Sax")
        MIDI_BARITONESAX = 67,
        // General MIDI instrument 68 ("Oboe")
        MIDI_OBOE = 68,
        // General MIDI instrument 69 ("English Horn")
        MIDI_ENGLISHHORN = 69,
        // General MIDI instrument 70 ("Bassoon")
        MIDI_BASSOON = 70,
        // General MIDI instrument 71 ("Clarinet")
        MIDI_CLARINET = 71,

        // Pipe Family:
        // General MIDI instrument 72 ("Piccolo")
        MIDI_PICCOLO = 72,
        // General MIDI instrument 73 ("Flute")
        MIDI_FLUTE = 73,
        // General MIDI instrument 74 ("Recorder")
        MIDI_RECORDER = 74,
        // General MIDI instrument 75 ("PanFlute")
        MIDI_PANFLUTE = 75,
        // General MIDI instrument 76 ("Blown Bottle")
        MIDI_BLOWNBOTTLE = 76,
        // General MIDI instrument 77 ("Shakuhachi")
        MIDI_SHAKUHACHI = 77,
        // General MIDI instrument 78 ("Whistle")
        MIDI_WHISTLE = 78,
        // General MIDI instrument 79 ("Ocarina")
        MIDI_OCARINA = 79,

        // Synth Lead Family:
        // General MIDI instrument 80 ("Lead 1 (square)")
        MIDI_LEAD1SQUARE = 80,
        // General MIDI instrument 81 ("Lead 2 (sawtooth)")
        MIDI_LEAD2SAWTOOTH = 81,
        // General MIDI instrument 82 ("Lead 3 (calliope)")
        MIDI_LEAD3CALLIOPE = 82,
        // General MIDI instrument 83 ("Lead 4 (chiff)")
        MIDI_LEAD4CHIFF = 83,
        // General MIDI instrument 84 ("Lead 5 (charang)")
        MIDI_LEAD5CHARANG = 84,
        // General MIDI instrument 85 ("Lead 6 (voice)")
        MIDI_LEAD6VOICE = 85,
        // General MIDI instrument 86 ("Lead 7 (fifths)")
        MIDI_LEAD7FIFTHS = 86,
        // General MIDI instrument 87 ("Lead 8 (bass + lead)")
        MIDI_LEAD8BASSPLUSLEAD = 87,

        // Synth Pad Family:
        // General MIDI instrument 88 ("Pad 1 (new age)")
        MIDI_PAD1NEWAGE = 88,
        // General MIDI instrument 89 ("Pad 2 (warm)")
        MIDI_PAD2WARM = 89,
        // General MIDI instrument 90 ("Pad 3 (polysynth)")
        MIDI_PAD3POLYSYNTH = 90,
        // General MIDI instrument 91 ("Pad 4 (choir)")
        MIDI_PAD4CHOIR = 91,
        // General MIDI instrument 92 ("Pad 5 (bowed)")
        MIDI_PAD5BOWED = 92,
        // General MIDI instrument 93 ("Pad 6 (metallic)")
        MIDI_PAD6METALLIC = 93,
        // General MIDI instrument 94 ("Pad 7 (halo)")
        MIDI_PAD7HALO = 94,
        // General MIDI instrument 95 ("Pad 8 (sweep)")
        MIDI_PAD8SWEEP = 95,

        // Synth Effects Family:
        // General MIDI instrument 96 ("FX 1 (rain)")
        MIDI_FX1RAIN = 96,
        // General MIDI instrument 97 ("FX 2 (soundtrack)")
        MIDI_FX2SOUNDTRACK = 97,
        // General MIDI instrument 98 ("FX 3 (crystal)")
        MIDI_FX3CRYSTAL = 98,
        // General MIDI instrument 99 ("FX 4 (atmosphere)")
        MIDI_FX4ATMOSPHERE = 99,
        // General MIDI instrument 100 ("FX 5 (brightness)")
        MIDI_FX5BRIGHTNESS = 100,
        // General MIDI instrument 101 ("FX 6 (goblins)")
        MIDI_FX6GOBLINS = 101,
        // General MIDI instrument 102 ("FX 7 (echoes)")
        MIDI_FX7ECHOES = 102,
        // General MIDI instrument 103 ("FX 8 (sci-fi)")
        MIDI_FX8SCIFI = 103,

        // Ethnic Family:
        // General MIDI instrument 104 ("Sitar")
        MIDI_SITAR = 104,
        // General MIDI instrument 105 ("Banjo")
        MIDI_BANJO = 105,
        // General MIDI instrument 106 ("Shamisen")
        MIDI_SHAMISEN = 106,
        // General MIDI instrument 107 ("Koto")
        MIDI_KOTO = 107,
        // General MIDI instrument 108 ("Kalimba")
        MIDI_KALIMBA = 108,
        // General MIDI instrument 109 ("Bagpipe")
        MIDI_BAGPIPE = 109,
        // General MIDI instrument 110 ("Fiddle")
        MIDI_FIDDLE = 110,
        // General MIDI instrument 111 ("Shanai")
        MIDI_SHANAI = 111,

        // Percussive Family:
        // General MIDI instrument 112 ("Tinkle Bell")
        MIDI_TINKLEBELL = 112,
        // General MIDI instrument 113 (Agogo"")
        MIDI_AGOGO = 113,
        // General MIDI instrument 114 ("Steel Drums")
        MIDI_STEELDRUMS = 114,
        // General MIDI instrument 115 ("Woodblock")
        MIDI_WOODBLOCK = 115,
        // General MIDI instrument 116 ("Taiko Drum")
        MIDI_TAIKODRUM = 116,
        // General MIDI instrument 117 ("Melodic Tom")
        MIDI_MELODICTOM = 117,
        // General MIDI instrument 118 ("Synth Drum")
        MIDI_SYNTHDRUM = 118,
        // General MIDI instrument 119 ("Reverse Cymbal")
        MIDI_REVERSECYMBAL = 119,

        // Sound Effects Family:
        // General MIDI instrument 120 ("Guitar Fret Noise")
        MIDI_GUITARFRETNOISE = 120,
        // General MIDI instrument 121 ("Breath Noise")
        MIDI_BREATHNOISE = 121,
        // General MIDI instrument 122 ("Seashore")
        MIDI_SEASHORE = 122,
        // General MIDI instrument 123 ("Bird Tweet")
        MIDI_BIRDTWEET = 123,
        // General MIDI instrument 124 ("Telephone Ring")
        MIDI_TELEPHONERING = 124,
        // General MIDI instrument 125 ("Helicopter")
        MIDI_HELICOPTER = 125,
        // General MIDI instrument 126 ("Applause")
        MIDI_APPLAUSE = 126,
        // General MIDI instrument 127 ("Gunshot")
        MIDI_GUNSHOT = 127
    };

    const std::string MIDIInstrumentNames[128] =
    {
        // Piano Family:
        "Acoustic Grand Piano",
        "Bright Acoustic Piano",
        "Electric Grand Piano",
        "Honky-tonk Piano",
        "Electric Piano 1",
        "Electric Piano 2",
        "Harpsichord",
        "Clavinet",

        // Chromatic Percussion Family:
        "Celesta",
        "Glockenspiel",
        "Music Box",
        "Vibraphone",
        "Marimba",
        "Xylophone",
        "Tubular Bells",
        "Dulcimer",

        // Organ Family:
        "Drawbar Organ",
        "Percussive Organ",
        "Rock Organ",
        "Church Organ",
        "Reed Organ",
        "Accordion",
        "Harmonica",
        "Tango Accordion",

        // Guitar Family:
        "Acoustic Guitar (nylon)",
        "Acoustic Guitar (steel)",
        "Electric Guitar (jazz)",
        "Electric Guitar (clean)",
        "Electric Guitar (muted)",
        "Overdriven Guitar",
        "Distortion Guitar",
        "Guitar harmonics",

        // Bass Family:
        "Acoustic Bass",
        "Electric Bass (finger)",
        "Electric Bass (pick)",
        "Fretless Bass",
        "Slap Bass 1",
        "Slap Bass 2",
        "Synth Bass 1",
        "Synth Bass 2",

        // Strings Family:
        "Violin",
        "Viola",
        "Cello",
        "Contrabass",
        "Tremolo Strings",
        "Pizzicato Strings",
        "Orchestral Harp",
        "Timpani",

        // Ensemble Family:
        "String Ensemble 1",
        "String Ensemble 2",
        "Synth Strings 1",
        "Synth Strings 2",
        "Choir Aahs",
        "Voice Oohs",
        "Synth Voice",
        "Orchestra Hit",

        // Brass Family:
        "Trumpet",
        "Trombone",
        "Tuba",
        "Muted Trumpet",
        "French Horn",
        "Brass Section",
        "Synth Brass 1",
        "Synth Brass 2",
            
        // Reed Family:
        "Soprano Sax",
        "Alto Sax",
        "Tenor Sax",
        "Baritone Sax",
        "Oboe",
        "English Horn",
        "Bassoon",
        "Clarinet",

        // Pipe Family:
        "Piccolo",
        "Flute",
        "Recorder",
        "Pan Flute",
        "Blown Bottle",
        "Shakuhachi",
        "Whistle",
        "Ocarina",

        // Synth Lead Family:
        "Lead 1 (square)",
        "Lead 2 (sawtooth)",
        "Lead 3 (calliope)",
        "Lead 4 (chiff)",
        "Lead 5 (charang)",
        "Lead 6 (voice)",
        "Lead 7 (fifths)",
        "Lead 8 (bass + lead)",

        // Synth Pad Family:
        "Pad 1 (new age)",
        "Pad 2 (warm)",
        "Pad 3 (polysynth)",
        "Pad 4 (choir)",
        "Pad 5 (bowed)",
        "Pad 6 (metallic)",
        "Pad 7 (halo)",
        "Pad 8 (sweep)",

        // Synth Effects Family:
        "FX 1 (rain)",
        "FX 2 (soundtrack)",
        "FX 3 (crystal)",
        "FX 4 (atmosphere)",
        "FX 5 (brightness)",
        "FX 6 (goblins)",
        "FX 7 (echoes)",
        "FX 8 (sci-fi)",

        // Ethnic Family:
        "Sitar",
        "Banjo",
        "Shamisen",
        "Koto",
        "Kalimba",
        "Bag pipe",
        "Fiddle",
        "Shanai",

        // Percussive Family:
        "Tinkle Bell",
        "Agogo",
        "Steel Drums",
        "Woodblock",
        "Taiko Drum",
        "Melodic Tom",
        "Synth Drum",
        "Reverse Cymbal",

        // Sound Effects Family:
        "Guitar Fret Noise",
        "Breath Noise",
        "Seashore",
        "Bird Tweet",
        "Telephone Ring",
        "Helicopter",
        "Applause",
        "Gunshot"
    };
}

#endif
